#!/bin/sh
set -e

TESTDIR="$(readlink -f "$(dirname "$0")")"
. "$TESTDIR/framework"
setupenvironment
configarchitecture 'amd64'

changetowebserver

TESTFILE='aptarchive/testfile'
HTTPFILE="http://localhost:${APTHTTPPORT}/testfile"
DOWNFILE='./downloaded/testfile'
DOWNLOADLOG='rootdir/tmp/testdownloadfile.log'

testdownloadfile() {
	rm -f "$DOWNLOADLOG"
	msgtest "Testing download of file with" "$1"
	if ! downloadfile "$HTTPFILE" "$DOWNFILE" > "$DOWNLOADLOG"; then
		cat >&2 "$DOWNLOADLOG"
		msgfail
	else
		msgpass
	fi
}

nopartialfile() {
	rm -f "$DOWNFILE"
}
validpartialfile() {
	head -n 5 "$TESTFILE" > "$DOWNFILE"
	touch -d "$(stat --format '%y' "${TESTFILE}")" "$DOWNFILE"
}
badolderpartialfile() {
	head -n 5 "$TESTFILE" > "$DOWNFILE"
	touch -d "$(stat --format '%y' "${TESTFILE}") - 1sec" "$DOWNFILE"
}
badnewerpartialfile() {
	head -n 5 "$TESTFILE" > "$DOWNFILE"
	touch -d 'now + 1hour' "$DOWNFILE"
}
fullfile() {
	cp -a "$TESTFILE" "$DOWNFILE"
}

cp -a "${TESTDIR}/framework" "$TESTFILE"

testrun() {
	nopartialfile
	testdownloadfile "no file $1"
	testwebserverlaststatuscode "$2" "$DOWNLOADLOG"
	testsuccess cmp "$TESTFILE" "$DOWNFILE"

	validpartialfile
	testdownloadfile "good partial file $1"
	testwebserverlaststatuscode "$3" "$DOWNLOADLOG"
	testsuccess cmp "$TESTFILE" "$DOWNFILE"

	badolderpartialfile
	testdownloadfile "bad old partial file $1"
	testwebserverlaststatuscode "$4" "$DOWNLOADLOG"
	testsuccess cmp "$TESTFILE" "$DOWNFILE"

	badnewerpartialfile
	testdownloadfile "bad new partial file $1"
	testwebserverlaststatuscode "$4" "$DOWNLOADLOG"
	testsuccess cmp "$TESTFILE" "$DOWNFILE"

	fullfile
	testdownloadfile "complete file $1"
	testwebserverlaststatuscode "$5" "$DOWNLOADLOG"
	testsuccess cmp "$TESTFILE" "$DOWNFILE"
}

testrun 'defaults' '200' '206' '200' '416'

webserverconfig 'aptwebserver::support::range' 'false'
testrun 'no ranges' '200' '200' '200' '200'
webserverconfig 'aptwebserver::support::range' 'true'

webserverconfig 'aptwebserver::support::if-range' 'false'
# the second 206 is bad, but we are unable to detect this
testrun 'buggy server' '200' '206' '206' '416'
echo 'Acquire::http::localhost::AllowRanges "false";' > rootdir/etc/apt/apt.conf.d/noallowranges
testrun 'range disabled by conf' '200' '200' '200' '200'
rm rootdir/etc/apt/apt.conf.d/noallowranges
# detect varnish < 6.4 automatically
webserverconfig 'aptwebserver::response-header::Via' '1.1 varnish (Varnish/6.1)'
testrun 'bad varnish' '200' '200' '200' '200'
webserverconfig 'aptwebserver::response-header::Via' '1.1 varnish (Varnish/6.4)'
testrun 'good varnish' '200' '206' '206' '416'
